6.2 Løkker
Løkker tar skrittet videre ved å la deg automatisere bruk av gjentakende kommandolinjer med lik struktur. F.eks. dersom du vil importere en variabel flere ganger med forskjellige måletidspunkt. Da kan du benytte kommandoen for
i kombinasjon med in
for å definere hvordan løkken skal itereres. Man kan enten definere et intervall gjennom bruk av et kolonntegn (:
), eller du kan liste verdiene det skal itereres over. Det er mulig å bruke både heltall, tekst og symboler som iteratorer, og det er mulig å iterere over mer enn en iterator i en løkke. Iteratorer kan ses på som en binding som genererer et sett med verdier som går fra først til siste verdi i en løkke. Merk at iterator-bindinger er lokale slik at man kan bruke de samme navnene i ulike løkker. Også bindinger som defineres inni en løkke er lokale.
Eksempel på bruk av løkker:
for iterator in 1 2 3
let double = $iterator * 2
end
for iterator in 1:3
let double = $iterator * 2
end
for år in 2019 : 2021
let siv_dato = $år ++ "-01-01"
let siv_år = siv_ ++ $år
import f/SIVSTANDFDT_SIVSTAND $siv_dato as $siv_år
end
Et typisk analyseeksempel der man importerer av et sett med variabler målt over flere år, for et tilfeldig utvalg av bosatte individer i en gitt aldergruppe:
let start_år = 2020
let start_dato = date_fmt($start_år + 1)
let minalder = 40
let maxalder = 50
create-dataset totalpop
import f/BEFOLKNING_FOEDSELS_AAR_MND as faarmnd
sample 0.1 12345
generate alder = $start_år - int(faarmnd/100)
import f/BEFOLKNING_STATUSKODE $start_dato as regstat
keep if regstat == '1' & alder >= $minalder & alder <= $maxalder
histogram alder, discrete freq
//Variant 1
for i in 2016 : 2020
let idato = date_fmt($i, 12, 31)
let yy = $i - 2000
let var = lønn ++ $yy
import f/INNTEKT_LONN $idato as $var
end
//Variant 2
for i in 2016 : 2020
import f/INNTEKT_LONN date_fmt($i, 12, 31) as lønn ++ $i - 2000 ++ "_2"
end
Et annet eksempel der man lager tre datasett med lik struktur, og som henter ut forløpsdata målt over året 2018 for hhv. arbeidssøkere, uføre, og sosialhjelpsmottakere. Dette brukes til å finne antall dager i de ulike statusene (i løpet av 2018). Datasettene kobles sammen med hoveddatasettet "bosatte" for hvert trinn:
for dbnavn, vnavn in ARBSOEK2001FDT_HOVED UFOERP2011FDT_GRAD SOSHJLPFDT_MOTTAK, arbsøk ufør sosial
create-dataset $vnavn ++ "data"
import-event db/$dbnavn 2018-01-01 to 2018-12-31 as $vnavn
let startvar = START@++$vnavn
let stoppvar = STOP@++$vnavn
let dagervar = $vnavn ++ "_dager"
replace $stoppvar = date(2018,12,31) if $stoppvar > date(2018,12,31)
replace $startvar = date(2018,01,01) if $startvar < date(2018,01,01)
generate $dagervar = $stoppvar - $startvar + 1
collapse(sum) $dagervar, by(PERSONID_1)
boxplot $dagervar
summarize $dagervar
histogram $dagervar, width(30)
merge $dagervar into bosatte
end
Nok et eksempel der man henter ut tverrsnittsdata over arbeidstid for alle arbeidstakere målt over alle månedene i 2018:
create-dataset arbeidstaker
for i in 1 : 9
import db/ARBLONN_PERS_SUM_ARBEIDSTID date_fmt(2018,0+$i,16) as arbtid0++$i, outer_join
end
for i in 10 : 12
import db/ARBLONN_PERS_SUM_ARBEIDSTID date_fmt(2018,$i,16) as arbtid++$i, outer_join
end
NB! Merk at bruk av inline-bindinger (
++
) ikke er kompatibelt med kommandoencollapse()
. Derfor bør du bruke bindinger gjennom bruk atlet
i forbindelse medcollapse()
-operasjoner.
Eksempel som ikke fungerer:
Bruk i stedet denne løsningen:
Komplett introduksjonsskript for bindinger og løkker finner du her%20(kan%20limes%20inn%20i%20skriptvinduet%20i%20microdata.no%20og%20kjøres).
Praktisk eksempel der man kobler sammen søsken til et datasett ved bruk av løkker finner du her.